package comun;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;




/*--------------------------- Estructura xml de consulta ----------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<consulta>
	<nbre_consulta>
	</nbre_consulta>
	<parametros>
		<parametro>
			<nbre_param></nbre_param>
			<valor></valor
		</parametro>
		...
		<parametro>
			<nbre_param></nbre_param>
			<valor></valor
		</parametro>
	</parametros>
</consulta>

------------------------- ejemplo ----------------------------------
<consulta>
	<nbre_consulta>
		obtenerRtdos
	</nbre_consulta>
	<parametros>
		<parametro>
			<nbre_param>idSesion</nbre_param>
			<valor>3</valor>
		</parametro>
		<parametro>
			<nbre_param>idTema</nbre_param>
			<valor>7</valor>
		</parametro>
	</parametros>
</consulta>

<consulta><nbre_consulta>obtenerRtdos</nbre_consulta><parametros><parametro><nbre_param>idSesion</nbre_param><valor>3</valor></parametro><parametro><nbre_param>idTema</nbre_param><valor>7</valor></parametro></parametros></consulta>
 */

/*
 FORMATO RESPUESTA - EJEMPLO
 <respuesta>
    <entrada>
        <id_sesion>1</id_sesion>
        <fecha>01-08-13</fecha>
    </entrada>
    ...
    <entrada>
        <id_sesion>3</id_sesion>
        <fecha>03-08-13</fecha>
    </entrada>
</respuesta>
 */
public class TraductorXMLConsultas {
	private DocumentBuilderFactory xmlFactory;
	private DocumentBuilder xmlBuilder;
	
	private TransformerFactory transfromer_fact;
	private Transformer transformer;
	
	public TraductorXMLConsultas(){
		 xmlFactory = DocumentBuilderFactory.newInstance();
			
		 try {
			xmlBuilder = xmlFactory.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		 transfromer_fact = TransformerFactory.newInstance();
		 try {
			transformer = transfromer_fact.newTransformer();
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public MensajeConsulta parsearXMLConsulta(String consulta_xml){
		 MensajeConsulta msjConsulta = new MensajeConsulta();
		try {
			Document xmlDoc = xmlBuilder.parse(new InputSource(new StringReader(consulta_xml)));
		
			//System.out.println(xmlDoc.getDocumentElement().getNodeName());
			
			Element nodos=xmlDoc.getDocumentElement();
			
			NodeList nombre_metodo = nodos.getElementsByTagName("nbre_consulta");
			//System.out.println(nombre_metodo.item(0).getTextContent());
			msjConsulta.setNbre_consulta(nombre_metodo.item(0).getTextContent());
			NodeList parametros = nodos.getElementsByTagName("parametro");
			
			for(int i=0; i<parametros.getLength(); i++){
				Element parametro = (Element) parametros.item(i);
				
				//System.out.println("\t"+parametro.getElementsByTagName("nbre_param").item(0).getTextContent());
				//System.out.println("\t"+parametro.getElementsByTagName("valor").item(0).getTextContent());
				String nbre_param=parametro.getElementsByTagName("nbre_param").item(0).getTextContent();
				String valor_param=parametro.getElementsByTagName("valor").item(0).getTextContent();
				
				msjConsulta.agregarParametro(nbre_param, valor_param);
			}
		
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return msjConsulta;
	}
	
	public String crearXMLConsulta(MensajeConsulta msj_consulta){
		String salida=null;
		
		Document nuevoXML = xmlBuilder.newDocument();
		
		Element elto_consulta = nuevoXML.createElement("consulta");
		nuevoXML.appendChild(elto_consulta);
		
		Element elto_nbre_consulta = nuevoXML.createElement("nbre_consulta");
		elto_consulta.appendChild(elto_nbre_consulta);
		
		elto_nbre_consulta.appendChild(nuevoXML.createTextNode(msj_consulta.getNbre_consulta()));
		
		Element elto_parametros = nuevoXML.createElement("parametros");
		elto_consulta.appendChild(elto_parametros);
		
		for(String[] param : msj_consulta.getParametros()){
			// parametros---------------------
				Element elt_parametro = nuevoXML.createElement("parametro");
				elto_parametros.appendChild(elt_parametro);
				
				Element elto_nbre_param = nuevoXML.createElement("nbre_param");
				elto_nbre_param.appendChild(nuevoXML.createTextNode(param[MensajeConsulta.INDEX_NBRE_PARAM]));
				elt_parametro.appendChild(elto_nbre_param);
				
				Element elto_valor =nuevoXML.createElement("valor");
				elto_valor.appendChild(nuevoXML.createTextNode(param[MensajeConsulta.INDEX_VALOR_PARAM]));
				elt_parametro.appendChild(elto_valor);
			// parametros---------------------
		}
		try {
			//transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
			StringWriter traductor = new StringWriter();
		
			transformer.transform(new DOMSource(nuevoXML), new StreamResult(traductor));
			
			salida = traductor.getBuffer().toString();
			
			
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
			
		} catch (TransformerException e) {
			e.printStackTrace();
		}
		
		return salida;
	}
	
	
	public String crearXMLRespuesta(ResultSet rtdos){
		String salida=null;
		
		try {

			ResultSetMetaData metadatos=rtdos.getMetaData();
			int cantColumnas=metadatos.getColumnCount();
		
			Document nuevoXML = xmlBuilder.newDocument();
			
			Element elto_consulta = nuevoXML.createElement("respuesta");
			nuevoXML.appendChild(elto_consulta);
			
			while(rtdos.next()){
				
				Element elt_entrada = nuevoXML.createElement("entrada");
				elto_consulta.appendChild(elt_entrada);
				
				for(int i=1; i<=cantColumnas; i++){
					String nbreColumna = metadatos.getColumnName(i);
					String valor=rtdos.getObject(i).toString();
					
					Element elto_campo = nuevoXML.createElement(nbreColumna);
					elto_campo.appendChild(nuevoXML.createTextNode(valor));
					elt_entrada.appendChild(elto_campo);
					
				}
			}
		
			//transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
			StringWriter traductor = new StringWriter();
		
			transformer.transform(new DOMSource(nuevoXML), new StreamResult(traductor));
			
			salida = traductor.getBuffer().toString();
			
			
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
			
		} catch (TransformerException e) {
			e.printStackTrace();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		
		return salida;
	}
	
	
	public Document parsearXMLRespuesta(String respuesta_xml){
		Document xmlDoc =null;
		try {
			xmlDoc = xmlBuilder.parse(new InputSource(new StringReader(respuesta_xml)));
		
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return xmlDoc;
	}
	
}
